package vip.websky.project.web.shiro;

import com.xiaoleilu.hutool.util.StrUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import vip.websky.project.core.utils.SpringContextUtil;
import vip.websky.project.module.bo.user.SysUserBO;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Author YangYong E-mail:yang2048@qq.com
 * @Create 2017/10/5-16:26
 **/

public class TokenManager {

    //用户登录管理
    public static final ShiroRealm realm = SpringContextUtil.getBean("sampleRealm", ShiroRealm.class);

    /**
     * 获取当前登录的用户User对象
     *
     * @return
     */
    public static SysUserBO getToken() {
        SysUserBO token = (SysUserBO) SecurityUtils.getSubject().getPrincipal();
        return token;
    }


    /**
     * 获取当前用户的Session
     *
     * @return
     */
    public static Session getSession() {
        return SecurityUtils.getSubject().getSession();
    }

    /**
     * 获取当前用户NAME
     *
     * @return
     */
    public static String getNickname() {
        return getToken().getUserName();
    }

    /**
     * 获取当前用户ID
     *
     * @return
     */
    public static Long getUserId() {
        return getToken() == null ? null : getToken().getId();
    }

    /**
     * 获取当前用户Role
     *
     * @return
     */
    public static Set<String> getRoles() {

        if (StrUtil.isNotBlank(getToken().getRoleCodes())) {
            Set<String> set = new HashSet<>();
            for (String string : getToken().getRoleCodes().split(",")) {
                set.add(string);
            }
            return getToken() == null ? null : set;
        } else {
            return null;
        }
    }

    /**
     * 把值放入到当前登录用户的Session里
     *
     * @param key
     * @param value
     */
    public static void setVal2Session(Object key, Object value) {
        getSession().setAttribute(key, value);
    }

    /**
     * 从当前登录用户的Session里取值
     *
     * @param key
     * @return
     */
    public static Object getVal2Session(Object key) {
        return getSession().getAttribute(key);
    }

    /**
     * 获取验证码，获取一次后删除
     *
     * @return
     */
    public static String getYZM() {
        String code = (String) getSession().getAttribute("CODE");
        getSession().removeAttribute("CODE");
        return code;
    }

    /**
     * 判断是否登录
     *
     * @return
     */
    public static boolean isLogin() {
        return null != SecurityUtils.getSubject().getPrincipal();
    }

    /**
     * 退出登录
     */
    public static void logout() {
        SecurityUtils.getSubject().logout();
    }

    /**
     * 清空当前用户权限信息。
     * 目的：为了在判断权限的时候，再次会再次 <code>doGetAuthorizationInfo(...)  </code>方法。
     * ps：	当然你可以手动调用  <code> doGetAuthorizationInfo(...)  </code>方法。
     * 这里只是说明下这个逻辑，当你清空了权限，<code> doGetAuthorizationInfo(...)  </code>就会被再次调用。
     */
    public static void clearNowUserAuth() {

    }


    /**
     * 根据UserIds 	清空权限信息。
     *
     * @param
     */
    public static void clearUserAuthByUserId(Long... userIds) {


    }


    /**
     * 方法重载
     *
     * @param userIds
     */
    public static void clearUserAuthByUserId(List<Long> userIds) {
        if (null == userIds || userIds.size() == 0) {
            return;
        }
        clearUserAuthByUserId(userIds.toArray(new Long[0]));
    }
}
